<?php
    /**
     * mongodb类
     * 
     * @author zhouqi 2012-10-31 AM 11:23:00
     */
    class cache_mongodb {
        private $host; //地址
        private $port; //端口    
        private $database;  //库

        private static $_mongodb;
        private static $_db;

        /**
         * 构造函数
         * 
         * @author zhouqi 2012-10-30 PM 03:41:49
         * @param array $config 配置信息
         * @return cache_mongodb
         */
        public function __construct($config) {
            $this->host = $config['host'];
            $this->port = $config['port'];
            $this->database = $config['database'];

            if(!$this->host || !$this->port || !$this->database) {
                return false;
            }

            self::$_mongodb = new Mongo("{$this->host}:{$this->port}");
            $this->_selectdb($this->database);            
        }                
        
        /**
         * 添加一条数据
         * 
         * @author zhouqi 2012-10-31 AM 11:52:05
         * @param string $table 表名
         * @param array $data   数据集
         */
        public function _insert($table, $data) {
            //选择表
            $crud = self::$_db->$table;
            
            return $crud->insert($data);
        }
        
        /**
         * 获取一条数据
         * 
         * @author zhouqi 2012-10-31 AM 11:48:55
         * @param string $table 表名
         * @param array $data   数据集           $gt为大于、$gte为大于等于、$lt为小于、$lte为小于等于、$ne为不等于
         * @param array $fields 显示的字段       array('field1' => true, 'field2' => true)
         */
        public function _findone($table, $data, $fields = '') {
        
            //选择表
            $crud = self::$_db->$table;
            
            //获取一条数据
            if(!$fields) {
                $datarow = $crud->findOne($data);
            } else {
                $datarow = $crud->findOne($data, $fields);
            }                        
            if(!$datarow){
            	return false;
            }
            $result = array();
            
            foreach($datarow as $k => $v) {
                if($k == '_id') {
                    continue;
                }
                
                $result[$k] = $v;
            }
            
            return $result;
        }
        
        /**
         * 查询数据集
         * 
         * @author zhouqi 2012-10-31 PM 01:30:43
         * @param string $table 表名
         * @param array $data   数据集           $gt为大于、$gte为大于等于、$lt为小于、$lte为小于等于、$ne为不等于
         * @param array $sort   排序             array('字段'=>-1));(-1倒序，1正序）
         * @param array $fields 显示的字段       array('field1' => true, 'field2' => true)
         */
        public function _find($table, $data, $sort = '', $fields = '') {                        
            
            //选择表
            $crud = self::$_db->$table;
            
            //获取数据集            
            if(!$fields) {
                $datarow = $crud->find($data);
            } else {
                $datarow = $crud->find($data, $fields);
            }
            
            //排序
            if($sort) {
                $datarow->sort($sort);
            }
            
            $result = array();
            foreach($datarow as $v) {
                unset($v['_id']);
                $result[] = $v;
            }
            
            return $result;
        }
        
        /**
         * 查询数据集,翻页效果
         * 
         * @author zhouqi 2012-10-31 PM 03:00:59
         * @param string $table 表名
         * @param array $data   数据集           $gt为大于、$gte为大于等于、$lt为小于、$lte为小于等于、$ne为不等于
         * @param array $sort   排序             array('字段'=>-1));(-1倒序，1正序）
         * @param int $page     当前页           1
         * @param int $pagesize 每页显示数       10
         * @param array $fields 显示的字段       array('field1' => true, 'field2' => true)
         */
        public function _findlimit($table, $data, $sort = '', $page = 1, $pagesize = 10, $fields = '') {
            //选择表
            $crud = self::$_db->$table;
            
            //获取数据集            
            if(!$fields) {
                $datarow = $crud->find($data);
            } else {
                $datarow = $crud->find($data, $fields);
            }
            
            //排序
            if($sort) {
                $datarow->sort($sort);
            }
            
            $datarow->skip(($page - 1)*$pagesize);
            $datarow->limit($pagesize);
            
            $result = array();
            foreach($datarow as $v) {
                unset($v['_id']);
                $result[] = $v;
            }
            
            return $result;
        }
        
        /**
         * 删除数据
         * 
         * @author zhouqi 2012-10-31 PM 03:00:59
         * @param string $table 表名
         * @param array $data   数据集           $gt为大于、$gte为大于等于、$lt为小于、$lte为小于等于、$ne为不等于
         */
        public function _delete($table, $data) {
            //选择表
            $crud = self::$_db->$table;            
            
            //删除数据
            $result = $crud->remove($data, array('safe' => true));
            
            if($result['ok']) {
                return true;
            }
            
            return false;
        }
        
        /**
         * 更新数据
         * 
         * @author zhouqi 2012-10-31 PM 03:00:59
         * @param string $table 表名
         * @param array $data   数据集           $gt为大于、$gte为大于等于、$lt为小于、$lte为小于等于、$ne为不等于
         * @param array $val    数据集           $inc加N值、$set赋值、$unset删除节点、$push附加一个新的值
         */
        public function _update($table, $data, $val) {
            //选择表
            $crud = self::$_db->$table;
                        
            $result = $crud->update($data, $val, array('safe' => true));
            
            if(!$result['updatedExisting']) {
                return false;
            }
            
            return true;
        }
                
        /**
         * 关闭链接
         * 
         * @author zhouqi 2012-10-31 PM 04:23:40
         */
        public function _close() {
            self::$_mongodb->close();
        }
        
        /**
         * 选择库
         * 
         * @author zhouqi 2012-10-31 AM 11:41:31
         * @param string $db    库名
         * @return cache_mongodb_operation
         */
        private function _selectdb($db) {
            if(self::$_mongodb == null) {
                return false;
            }
            
            self::$_db = self::$_mongodb->selectDB($db);            
        }
        
        /**
         * 获取mongodb对象
         * 
         * @author zhouqi 2012-10-31 AM 11:46:57
         */
        protected function _get_mongodb() {
            return self::$_mongodb;
        }
    }
?>